home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / programm / gemfsc20 / gemfsc20.lzh / EXAMPLES / BROWSE / BRLLIST.C < prev    next >
Text File  |  1992-12-07  |  4KB  |  142 lines

  1. /*****************************************************************************
  2.  * BRLLIST - Routines for dealing with lines attached to a browser.
  3.  ****************************************************************************/
  4.  
  5. #include <string.h>
  6.  
  7. #define BROWSER_INTERNALS
  8. #include "browser.h"
  9.  
  10. #ifndef NULL
  11.   #define NULL ((void*)0)
  12. #endif
  13.  
  14. #ifndef TRUE
  15.   #define TRUE    1
  16.   #define FALSE 0
  17. #endif
  18.  
  19. void br_recount(browser)
  20. /*****************************************************************************
  21.  * count lines attached to browser, update internal data.
  22.  ****************************************************************************/
  23.     register Browser *browser;
  24. {
  25.     register BrowseLine *cur;
  26.     register long        longest_line;
  27.     register long        num_lines;
  28.  
  29.     if (NULL == browser)
  30.         return;
  31.  
  32.     num_lines     = 0;
  33.     longest_line = 0;
  34.  
  35.     for(cur = browser->linelist.head; cur != NULL; cur = cur->hdr.next) {
  36.         ++num_lines;
  37.         if (longest_line < cur->length)
  38.             longest_line = cur->length;
  39.     }
  40.  
  41.     browser->num_lines      = num_lines;
  42.     browser->longest_line = longest_line;
  43.     browser->curline_num  = dl_tell(&browser->linelist);
  44. }
  45.  
  46.  
  47. void brl_delete(linelist, line)
  48. /*****************************************************************************
  49.  * delete a single line.
  50.  *    use this one if you're going to delete a bunch of lines, then after nuking
  51.  *    them all, call br_recount() to update internal data.  this will be
  52.  *    faster than calling the br_ldelete() routine on each line.
  53.  ****************************************************************************/
  54.     DlList    *linelist;
  55.     void    *line;
  56. {
  57.     if (NULL == linelist || NULL == line)
  58.         return;
  59.     dl_remove(linelist, line);
  60.     br_free(line);
  61. }
  62.  
  63. void br_ldelete(browser, line)
  64. /*****************************************************************************
  65.  * delete a line, or all lines, update internal data.
  66.  ****************************************************************************/
  67.     register Browser     *browser;
  68.     register BrowseLine  *line;
  69. {
  70.     int need_update = FALSE;
  71.  
  72.     if (NULL == browser)
  73.         return;
  74.  
  75.     if (NULL == line) {
  76.         dl_freelist(&browser->linelist, brl_delete);
  77.         browser->num_lines = 0;
  78.         browser->longest_line = 0;
  79.     } else {
  80.         if (line->length == browser->longest_line || line == browser->linelist.cur) {
  81.             need_update = TRUE;
  82.         }
  83.         brl_delete(&browser->linelist, line);
  84.         if (need_update) {
  85.             br_recount(browser);
  86.         } else {
  87.             --browser->num_lines;
  88.         }
  89.     }
  90.  
  91. }
  92.  
  93. BrowseLine *brl_add(linelist, string)
  94. /*****************************************************************************
  95.  * add a line to the browser.
  96.  *    use this one if you're going to add a bunch of lines, then after adding
  97.  *    them all, call br_recount() to update internal data.  this will be
  98.  *    faster than calling the br_ladd() routine on each line.
  99.  ****************************************************************************/
  100.     DlList    *linelist;
  101.     char    *string;
  102. {
  103.     register BrowseLine  *newline;
  104.     register short         len;
  105.  
  106.     if (NULL == linelist || NULL == string)
  107.         return NULL;
  108.  
  109.     len = strlen(string);
  110.  
  111.     if (NULL == (newline = br_malloc(sizeof(BrowseLine)+len+1)))
  112.         return NULL;
  113.  
  114.     newline->length = len;
  115.     newline->string = (char *)(newline+1);
  116.  
  117.     strcpy(newline->string, string);
  118.  
  119.     return dl_addtail(linelist, newline);
  120. }
  121.  
  122. BrowseLine *br_ladd(browser, string)
  123. /*****************************************************************************
  124.  * add a line to a browser, update internal data.
  125.  ****************************************************************************/
  126.     register Browser    *browser;
  127.     char                *string;
  128. {
  129.     BrowseLine    *newline;
  130.  
  131.     if (NULL == browser || NULL == string)
  132.         return NULL;
  133.  
  134.     if (NULL != (newline = brl_add(&browser->linelist, string))) {
  135.         if (browser->longest_line < newline->length)
  136.             browser->longest_line = newline->length;
  137.         ++browser->num_lines;
  138.     }
  139.  
  140.     return newline;
  141. }
  142.